home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / vbdatabs / pscript.cpp < prev    next >
C/C++ Source or Header  |  1999-03-14  |  29KB  |  915 lines

  1. // ------------------------------- //
  2. // -------- Start of File -------- //
  3. // ------------------------------- //
  4. // ----------------------------------------------------------- // 
  5. // C++ Source Code File Name: pscript.cpp
  6. // Compiler Used: MSVC40, DJGPP 2.7.2.1, GCC 2.7.2.1, HP CPP 10.24
  7. // Produced By: Doug Gaer 
  8. // File Creation Date: 12/17/1997  
  9. // Date Last Modified: 03/15/1999
  10. // Copyright (c) 1997 Douglas M. Gaer
  11. // ----------------------------------------------------------- // 
  12. // ------------- Program Description aond Details ------------- // 
  13. // ----------------------------------------------------------- // 
  14. /*
  15. The VBD C++ classes are copyright (c) 1997, by Douglas M. Gaer.
  16. All those who put this code or its derivatives in a commercial
  17. product MUST mention this copyright in their documentation for
  18. users of the products in which this code or its derivative
  19. classes are used. Otherwise, you have the freedom to redistribute
  20. verbatim copies of this source code, adapt it to your specific
  21. needs, or improve the code and release your improvements to the
  22. public provided that the modified files carry prominent notices
  23. stating that you changed the files and the date of any change.
  24.  
  25. THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND.
  26. THE ENTIRE RISK OF THE QUALITY AND PERFORMANCE OF THIS SOFTWARE
  27. IS WITH YOU. SHOULD ANY ELEMENT OF THIS SOFTWARE PROVE DEFECTIVE,
  28. YOU WILL ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR, OR
  29. CORRECTION.
  30.  
  31. The PostScriptDrv class is used to create postscript documents.
  32. This version prints postscript documents to a file.
  33. */
  34. // ----------------------------------------------------------- // 
  35. #include <stdio.h>
  36. #include <string.h>
  37. #include <ctype.h>
  38. #include <time.h>
  39. #include <math.h> // For ceil() function
  40. #include "pscript.h"
  41.  
  42. // PostScript fonts
  43. const char *PostScriptFonts[NumberOfFonts] = {
  44.   // Courier fonts
  45.   "Courier",             // COURIER
  46.   "Courier-Bold",        // COURIER_BOLD
  47.   "Courier-Oblique",     // COURIER_OBLIQUE
  48.   "Courier-BoldOblique", // COURIER_BOLD_OBLIQUE
  49.  
  50.   // Times-Roman fonts
  51.   "Times-Roman",      // TIMES
  52.   "Times-Bold",       // TIMES_BOLD
  53.   "Times-Italic",     // TIMES_ITALIC
  54.   "Times-BoldItalic", // TIMES_BOLD_ITALIC
  55.  
  56.   // Helvetica fonts
  57.   "Helvetica",             // HELV
  58.   "Helvetica-Bold",        // HELV_BOLD
  59.   "Helvetica-Oblique",     // HELV_OBLIUQE
  60.   "Helvetica-BoldOblique", // HELV_BOLD_OBLIQUE
  61.  
  62.   // Symbol font
  63.   "Symbol" // SYMBOL                     
  64. };
  65.  
  66. // PostScript command strings defined in the postscript prologue
  67. const char *BACKSPACE  = "B";
  68. const char *ENDPAGE    = "EP";
  69. const char *LINETO     = "L";
  70. const char *MOVETO     = "M";
  71. const char *NEWPATH    = "NP";
  72. const char *SHOW       = "S";
  73. const char *STARTPAGE  = "SP";
  74. const char *STROKE     = "ST";
  75. const char *TAB        = "T";
  76.  
  77. void GetSystemTime(char *s, int full_month_name)
  78. // Stand alone function use to create a custom time string for
  79. // PostScript headers.
  80. {
  81.   time_t STime;
  82.   struct tm *TimeBuffer;
  83.   char month[25]; char day[25]; char year[25];
  84.   char hour[25]; char minutes[25]; char seconds[25];
  85.   time(&STime);
  86.   TimeBuffer = localtime(&STime);
  87.   if(full_month_name)
  88.     strftime(month, 25, "%B", TimeBuffer);
  89.   else
  90.     strftime(month, 25, "%b", TimeBuffer);
  91.   strftime(day, 25, "%d", TimeBuffer);
  92.   strftime(year, 25, "%Y", TimeBuffer);
  93.   strftime(hour, 25, "%H", TimeBuffer);
  94.   strftime(minutes, 25, "%M", TimeBuffer);
  95.   strftime(seconds, 25, "%S", TimeBuffer);
  96.  
  97.   // Weekday Name Month Day, Year HH:MM:SS
  98.   sprintf(s, "%s %s, %s %s:%s:%s", month, day, year, hour, minutes, seconds);
  99. }
  100.  
  101. PostScriptDrv::PostScriptDrv()
  102. {
  103.   ncopies = 1;          // Print at least one copy of this document
  104.   landscape = 0;        // Use portrait mode by default
  105.   use_header = 0;       // Do not use headers and trailers by default
  106.   use_lr_margin = 0;    // Do not use left and right margins by default  
  107.   use_tb_margin = 0;    // Do not use top and bottom margins by default
  108.   document_name = 0;    // Name of this document
  109.   date_string = 0;      // Time and date this document was printed
  110.   draw_header_line = 0; // Do not draw line between header and document 
  111.  
  112.   tabstop = DEFAULT_TAB_SIZE;
  113.   page_count = 0;
  114.   SetFont(COURIER, 10);
  115.   DocumentSetup();
  116.   row = start_y;
  117.   line_count = lines_per_page;
  118.   SetHeaderFont(COURIER_BOLD, 15);
  119. }
  120.  
  121. PostScriptDrv::PostScriptDrv(const PostScriptDrv &ob)
  122. {
  123.   ncopies = ob.ncopies;        
  124.   landscape = ob.landscape;      
  125.   lines_per_page = ob.lines_per_page;
  126.   columns = ob.columns;
  127.   tabstop = ob.tabstop;
  128.   row = ob.row;
  129.   start_x = ob.start_x;
  130.   start_y = ob.start_y;
  131.   page_count = ob.page_count;
  132.   font_size = ob.font_size;
  133.   page_width = ob.page_width; 
  134.   page_height = ob.page_height;
  135.   chars_per_inch = ob.chars_per_inch;
  136.   char_width = ob.char_width;
  137.   text_font = ob.text_font;
  138.   use_lr_margin = ob.use_lr_margin;
  139.   use_tb_margin = ob.use_tb_margin;
  140.   use_header = ob.use_header;
  141.   header_font = ob.header_font;
  142.   header_font_size = ob.header_font_size;
  143.   document_name = ob.document_name;
  144.   date_string = ob.date_string;
  145.   draw_header_line = ob.draw_header_line;
  146.   line_count = ob.line_count;
  147. }
  148.   
  149. PostScriptDrv &PostScriptDrv::operator=(const PostScriptDrv &ob)
  150. {
  151.   ncopies = ob.ncopies;        
  152.   landscape = ob.landscape;      
  153.   lines_per_page = ob.lines_per_page;
  154.   columns = ob.columns;
  155.   tabstop = ob.tabstop;
  156.   row = ob.row;
  157.   start_x = ob.start_x;
  158.   start_y = ob.start_y;
  159.   page_count = ob.page_count;
  160.   font_size = ob.font_size;
  161.   page_width = ob.page_width; 
  162.   page_height = ob.page_height;
  163.   text_font = ob.text_font;
  164.   chars_per_inch = ob.chars_per_inch;
  165.   char_width = ob.char_width;
  166.   use_lr_margin = ob.use_lr_margin;
  167.   use_tb_margin = ob.use_tb_margin;
  168.   use_header = ob.use_header;
  169.   header_font = ob.header_font;
  170.   header_font_size = ob.header_font_size;
  171.   document_name = ob.document_name;
  172.   date_string = ob.date_string;
  173.   draw_header_line = ob.draw_header_line;
  174.   line_count = ob.line_count;
  175.   
  176.   return *this;
  177. }
  178.  
  179. void PostScriptDrv::SetFont(PSFonts font, double size)
  180. {
  181.   switch(font){
  182.     case COURIER:              
  183.       font_size = size;
  184.       char_width = 0.6 * font_size; // Width of each character
  185.       break;
  186.       
  187.     case COURIER_BOLD:         
  188.       font_size = size;
  189.       char_width = 0.6 * font_size; // Width of each character
  190.       break;
  191.       
  192.     case COURIER_OBLIQUE:      
  193.       font_size = size;
  194.       char_width = 0.6 * font_size; // Width of each character
  195.       break;
  196.       
  197.     case COURIER_BOLD_OBLIQUE: 
  198.       font_size = size;
  199.       char_width = 0.6 * font_size; // Width of each character
  200.       break;
  201.       
  202.     case TIMES:             
  203.       font_size = size;
  204.       char_width = 0.57 * font_size; // Width of each character
  205.       break;
  206.       
  207.     case TIMES_BOLD:        
  208.       font_size = size;
  209.       char_width = 0.6 * font_size; // Width of each character
  210.       break;
  211.       
  212.     case TIMES_ITALIC:      
  213.       font_size = size;
  214.       char_width = 0.55 * font_size; // Width of each character
  215.       break;
  216.       
  217.     case TIMES_BOLD_ITALIC: 
  218.       font_size = size;
  219.       char_width = 0.58 * font_size; // Width of each character
  220.       break;
  221.       
  222.     case HELV:             
  223.       font_size = size;
  224.       char_width = 0.6 * font_size; // Width of each character
  225.       break;
  226.       
  227.     case HELV_BOLD:        
  228.       font_size = size;
  229.       char_width = 0.6 * font_size; // Width of each character
  230.       break;
  231.       
  232.     case HELV_OBLIQUE:     
  233.       font_size = size;
  234.       char_width = 0.6 * font_size; // Width of each character
  235.       break;
  236.       
  237.     case HELV_BOLD_OBLIQUE:
  238.       font_size = size;
  239.       char_width = 0.6 * font_size; // Width of each character
  240.       break;
  241.       
  242.     case SYMBOL:
  243.       font_size = size;
  244.       char_width = 0.57 * font_size; // Width of each character
  245.       break;
  246.  
  247.     default: // COURIER              
  248.       font_size = DEFAULT_POINT_SIZE;
  249.       char_width = 0.6 * font_size; // Width of each cha